home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-23 | 1.3 KB | 60 lines | [TEXT/????] |
- SYSTEM systolic_array;
- (* compute the matrix product "c := a * b" *)
- CONST max = 10;
- TYPE matrix = ARRAY [1..max],[1..max] OF REAL;
-
- CONFIGURATION grid [max],[max];
- CONNECTION left: grid[i,j] -> grid[i,(j-1) MOD max].left;
- up: grid[i,j] -> grid[(i-1) MOD max,j].up;
- shiftA: grid[i,j] -> grid[i,(j-i) MOD max].shiftA;
- shiftB: grid[i,j] -> grid[(i-j) MOD max,j].shiftB;
-
- SCALAR i,j : INTEGER;
- a,b,c : matrix;
-
-
- PROCEDURE matrix_mult(SCALAR VAR a,b,c : matrix);
- (* c := a * b *)
- SCALAR k: INTEGER;
- VECTOR ra,rb,rc : REAL;
- BEGIN
- LOAD (ra,a);
- LOAD (rb,b);
- PARALLEL
- PROPAGATE.shiftA(ra);
- PROPAGATE.shiftB(rb);
- rc := ra * rb;
- FOR k := 2 TO max DO
- PROPAGATE.left(ra);
- PROPAGATE.up(rb);
- rc := rc + ra * rb;
- END;
- ENDPARALLEL;
- STORE(rc,c);
- END matrix_mult;
-
-
- PROCEDURE out(SCALAR VAR a: matrix);
- SCALAR i,j: CARDINAL;
- BEGIN
- FOR i:=1 TO max DO
- FOR j:=1 TO max DO WriteFixPt(a[i,j], 10,2) END;
- WriteLn
- END;
- WriteLn
- END out;
-
- BEGIN
- (* preset input matrices "a" and "b" (or read them from a file instead) *)
- FOR i:=1 TO max DO
- FOR j:=1 TO max DO
- a[i,j]:=FLOAT(10*i+j);
- b[i,j]:=FLOAT(i+j);
- END;
- END;
- out(a); out(b);
- matrix_mult(a,b,c);
- out(c); (* print result matrix "c" *)
- END systolic_array.
-
-